home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / book / src / wc.c < prev   
C/C++ Source or Header  |  1993-07-08  |  53KB  |  1,728 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <string.h>
  4. #include    <ctype.h>
  5. #include    <msdos.cf>
  6. #include    <system.cf>
  7. #include    <status.cf>
  8. #include    <egb.h>
  9. #include    <mos.h>
  10. #include    <fmc.h>
  11. #include    "file.h"
  12. #include    "event.h"
  13. #include    "init.h"
  14. #include    "book.h"
  15. #include    "lib.h"
  16. #include    "doslib.h"
  17. #include    "keyio.h"
  18. #include    "menu.h"
  19. #include    "mouse.h"
  20.  
  21. #define CD_NO_STOP      /*  CD-ROMへ移動すると、停止時間を無限大にする  */
  22. #ifdef CD_NO_STOP
  23. # include   <cdr.h>
  24. #endif
  25.  
  26. #define MOUSE_PAGE  1   /*  マウスカーソルはページ1に描く  */
  27.  
  28. #define EXIT_X  594             /*  直接終了するボタン  */
  29. #define EXIT_Y  7
  30.  
  31. #define CARD_X          484
  32. #define CARD_Y          19
  33. #define CARD_MAX        10      /*  maximum wildcard num  */
  34. #define CARD_LEN        12
  35.  
  36. #define DRV_MAX         26      /*  論理ドライブ A - Z  */
  37. #define HARD_DRV_MAX    16      /*  物理ドライブ A - P  */
  38. #define DRV_LEN         8
  39.  
  40. #define CLIP_X          (DSP_X+4)
  41. #define CLIP_Y          4
  42. #define CLIP_SIZ        38
  43.  
  44. #define ROLL_X          (DSP_X+DSP_LEN*8+4+2+2) /*  スクロールボタン  */
  45. #define ROLLUP_Y        (DSP_Y)
  46. #define ROLLDOWN_Y      (DSP_Y+(DSP_MAX_SLOT-1)*SPC_Y)
  47. #define ROLL_LEN        2
  48.  
  49. #define SCROLL_X        (ROLL_X)        /*  スクロールバー  */
  50. #define SCROLL_X_SIZ    (ROLL_LEN*8+3)
  51. #define SCROLL_Y        (ROLLUP_Y+SPC_Y+4+4)
  52. #define SCROLL_Y_SIZ    (ROLLDOWN_Y-2 - SCROLL_Y - 8)
  53.  
  54. #define DSP_X           152
  55. #define DSP_LEN         36
  56.  
  57. #define FNT_SIZ         16      /* 8 or 16 */
  58.  
  59. #define DSP_Y           28
  60.  
  61. #define DSP_MAX1        14
  62. #define DSP_MAX2        28
  63. #define DSP_MAX_SLOT    14
  64. #define DSP_MAX_EVT     (DSP_MAX2+5)    /*  DSP_MAX2 より大きければいい  */
  65.  
  66. #define FNT_SPC_X       2
  67. #define FNT_SPC_Y       1
  68.  
  69. #define SPC_Y           19      /*  一行の縦方向のドット数(全体)  */
  70. #define SIZ_Y           17      /*  一行の縦方向のドット数(文字部分)  */
  71.  
  72. #define SORT_X          (CARD_X)
  73. #define SORT_Y          (CARD_Y+CARD_MAX*SPC_Y+5)
  74. #define SORT_MAX        (2)
  75. #define SORT_LEN        (CARD_LEN)
  76.  
  77. #define COLUMN_X        (CARD_X)
  78. #define COLUMN_Y        (SORT_Y+SORT_MAX*SPC_Y+4)
  79. #define COLUMN_LEN      (CARD_LEN)
  80.  
  81. #define ISDIR(c)        (c->att&0x10)
  82. #define ISHID(c)        (c->att&0x02)
  83. #define ISSYS(c)        (c->att&0x04)
  84.  
  85. #define IS_FLP          0x00
  86. #define IS_SCSI         0x02
  87. #define IS_RAM          0x03
  88. #define IS_MDC          0x04
  89. #define IS_ROM          0x05
  90. #define IS_CDR          0x06    /*  勝手に決めました  */
  91. #define IS_ICMC         0x07    /*  勝手に決めました  */
  92. #define IS_NON          0xFF
  93.  
  94. typedef Find_buffer  find_t ;
  95. typedef struct  _WCBUF  /*  この構造体はアラインしない  */
  96. {
  97.     struct _WCBUF       *back ;
  98.     struct _WCBUF       *next ;
  99.     short int           mark ;
  100.     short int           att ;
  101.     unsigned short int  time, date ;
  102.     unsigned long       size ;
  103.     char                name[14] ;
  104. } WCBUF ;
  105.  
  106. typedef struct _CDBUF
  107. {
  108.     short int   mark, allocate ;
  109.     char        *name ;
  110. } CDBUF ;
  111.  
  112. static  short   disktype[DRV_MAX] =
  113. {
  114.     IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON,
  115.     IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON,
  116.     IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON, IS_NON,
  117.     IS_NON, IS_NON,
  118. } ;
  119.  
  120. static  char    *sort_name[] = {
  121.         " \x83\x5Cートなし ", " ファイル名 ", " 拡張子優先 ", NULL } ;
  122.      /* " ソートなし ",       " ファイル名 ", " 拡張子優先 ", NULL } ; */
  123. static  char    *fs_mode_name[] = { "    1段    ", "    2段    ", NULL } ;
  124.  
  125.  
  126. static  int     CDRV = -1;
  127. static  mevt_t  event = MEv_NULL;
  128. static  int     click_pos = 0 ;     /*  パスリストのどこをクリックしたのか  */
  129. static  int     stat_sw ;           /*  マウスのスイッチ  */
  130. static  char    crrdir[256] ;       /*  現在のカレント・ディレクトリ  */
  131. static  int     marked = -1 ;           /*  マークされているファイル  */
  132. static  int     DSP_MAX = DSP_MAX1 ;    /*  一度に表示するファイルの数  */
  133.         int     mos_disp_off = MOS_OFF ;    /*  マウスカーソルは消す  */
  134.  
  135. static  CDBUF   card[ CARD_MAX ] =
  136. {
  137.     { TRUE, FALSE,"*.*" }, { FALSE,TRUE,NULL }, { FALSE,TRUE,NULL },
  138.     { FALSE,TRUE,NULL   }, { FALSE,TRUE,NULL }, { FALSE,TRUE,NULL },
  139.     { FALSE,TRUE,NULL   }, { FALSE,TRUE,NULL }, { FALSE,TRUE,NULL },
  140.     { FALSE,TRUE,NULL   },
  141. } ;
  142.  
  143. typedef struct
  144. {
  145.     int     max;        /* 現在のディレクトリのディレクトリエントリ数 */
  146.     int     maxl;       /* ファイルを表示するときの最大行数 */
  147.     int     top;        /* 表示中のトップ位置(番号) */
  148.     WCBUF   *topwp;     /* ファイルリストの先頭 */
  149.     WCBUF   *twp;       /* 表示中のトップ位置(リスト) */
  150. }   FILE_t ;
  151.  
  152. static  FILE_t  files = { 0,0,0, NULL,NULL } ;
  153. static  int     vol_size = 0, bar_size = 0 ;
  154.  
  155. extern  void    dsp_all( int rewrite, REGS WCBUF *wp, int top ) ;
  156.  
  157.  
  158.  
  159. static  WCBUF   *wc_read( char *path, int attr )
  160. {
  161.     static  int     opflg = FALSE ;
  162.     static  find_t  find ;
  163.     auto    WCBUF   *wp ;
  164.  
  165.     errno = 0 ;
  166.     if( opflg == FALSE )
  167.         c_find_first( path, &find, attr ) ;
  168.     else
  169.         find_next( &find ) ;
  170.     opflg = TRUE ;
  171.  
  172.     if( errno != 0 )    /*  perhaps, "No More Files"  */
  173.     {
  174.         opflg = FALSE ;
  175.         return NULL ;
  176.     }
  177.     if( ( wp = (WCBUF *)malloc(sizeof(WCBUF))) != NULL )
  178.     {
  179.         wp->back = wp->next = NULL ;
  180.         wp->mark = OFF ;
  181.         wp->att = find.Attr ;
  182.         wp->date = find.Date ;
  183.         wp->time = find.Time ;
  184.         wp->size = find.Size ;
  185.         strcpy( wp->name, find.Name ) ;
  186.     }
  187.     return wp ;
  188. }
  189.  
  190. static  char    toup( int ch )
  191. {
  192.     return toupper(ch) ;
  193. }
  194.  
  195. static  int     patmatch( char *arg, char *nam )
  196. {
  197.     int     i, j ;
  198.  
  199.     for( ; *arg != '\0' && *nam != '\0' ; )
  200.     {
  201.         i = toup( *(arg++) ) ;
  202.         j = toup( *(nam++) ) ;
  203.         if( i == '*' )
  204.         {
  205.             do {
  206.                 if( ( i = toup( *(arg++)) ) == '\0' )
  207.                     return TRUE ;
  208.             } while ( i == '*' || i == '?' ) ;
  209.             do {
  210.                 if ( j == i && patmatch( arg, nam ) == TRUE )
  211.                     return TRUE ;
  212.             } while ( (j = toup(*(nam++))) != '\0' ) ;
  213.             if( i == '.' && *arg == '*' )
  214.                 return TRUE ;
  215.             else
  216.                 return FALSE ;
  217.         }
  218.         else if( i != '?' && i != j )
  219.             return FALSE ;
  220.     }
  221.     if( *arg == '\0' && *nam == '\0' )
  222.         return TRUE ;
  223.     else
  224.         return FALSE ;
  225. }
  226.  
  227. /*  拡張子があれば、その先頭のポインタなければ¥0を返す  */
  228. static  char    *subname( REGS char *name )
  229. {
  230.     static  char    *nul = "\0" ;
  231.     auto    char    *p ;
  232.  
  233.     if( *name == '.' || ( p = strchr( name, '.' ) ) == NULL )
  234.         name = nul ;
  235.     else
  236.         name = p + 1 ;
  237.  
  238.     return name ;
  239. }
  240.  
  241. static  char    *formname( char *name )
  242. {
  243.     static  char    tmp[ 14 ] ;
  244.             char    tmp2[ 16 ] ;
  245.             char    *p = NULL ;
  246.  
  247.     strcpy( tmp2, name ) ;
  248.     if( *name != '.' && ( p = strchr( tmp2, '.' ) ) != NULL )
  249.         *p++ = '\0' ;                           /*  拡張子あり  */
  250.  
  251.     /* sprintf( tmp, "%-8s %-3s", tmp2, p==NULL ? "":p ) ; */
  252.     strcpy( tmp, formstrL( tmp2, 9 ) ) ;
  253.     if( p != NULL )
  254.         strcat( tmp, formstrL( p, 3 ) ) ;
  255.  
  256.     return tmp ;
  257. }
  258.  
  259. static  int     cmpname( WCBUF *sp, WCBUF *dp )
  260. {
  261.     int     ret ;
  262.  
  263.     if( ISDIR( sp ) != ISDIR( dp ) )
  264.         return ISDIR(sp) ? -1 : 1 ;
  265.  
  266.     if( setup.sort_mode == SORT_EXT &&
  267.             ( ret = strcmp( subname(sp->name), subname(dp->name) ) ) != 0 )
  268.         return ret ;
  269.  
  270.     return strcmp( sp->name, dp->name ) ;
  271. }
  272. static  WCBUF   *wc_sort( WCBUF *sp, WCBUF *dp )
  273. {
  274.     REGS    WCBUF   *tp ;
  275.     auto    WCBUF   root ;  /*  番兵  */
  276.  
  277.     tp = &root ;
  278.     if( ( tp->next = sp ) == NULL )
  279.         return dp ;
  280.     while( tp->next != NULL )
  281.     {
  282.         if( setup.sort_mode != SORT_NOT )     /*  ソートする  */
  283.             if( cmpname( tp->next, dp ) >= 0 )
  284.                 break ;
  285.         tp = tp->next ;
  286.     }
  287.     /*  (tp) → (tp->next) の間にdpを挿入  */
  288. /*    dp->next = tp->next ;
  289.     tp->next = dp ; */
  290.     dp->next = tp->next ;
  291.     dp->back = tp ;
  292.     tp->next = dp ;
  293.     if( dp->next != NULL )
  294.         (dp->next)->back = dp ;
  295.  
  296.     return root.next ;
  297. }
  298.  
  299. static  WCBUF   *wc_reset( REGS WCBUF *wp )
  300. {
  301.     WCBUF   *tp ;
  302.  
  303.     while( wp != NULL )
  304.     {
  305.         tp = wp->next ;
  306.         free( wp ) ;
  307.         wp = tp ;
  308.     }
  309.  
  310.     files.top = 0;
  311.     files.twp = NULL;
  312.     files.max = 0;
  313.     files.maxl = 0;
  314.  
  315.     return NULL ;
  316. }
  317.  
  318. static  int     wild_chk( char *file )
  319. {
  320.     int     i;
  321.  
  322.     for( i = 0 ; i < CARD_MAX ; i++ )
  323.     {
  324.         if( card[i].mark && patmatch( card[i].name, file ) )
  325.             return TRUE ;
  326.     }
  327.     return FALSE ;
  328. }
  329. static  WCBUF   *wc_open( void )
  330. {
  331.     WCBUF   *topwp = NULL ;
  332.     WCBUF   *wp ;
  333.     int     max = 0 ;
  334.  
  335.     mos_ptn( MOSCSR_CLOCK ) ;
  336.     while( ( wp = wc_read( "*.*", 0x16 ) ) != NULL )
  337.     {
  338.         if( wp->name[0] == '.' && wp->name[1] == '\0' )
  339.             free( wp ) ;
  340.         else if( ISDIR( wp ) || wild_chk( wp->name ) )
  341.             topwp = wc_sort( topwp, wp ), max ++ ;
  342.         else
  343.             free( wp ) ;
  344.     }
  345.     mos_ptn( MOSCSR_FINGER ) ;
  346.  
  347.     files.max = max;
  348.     files.maxl = (max + setup.fs_mode - 1) / setup.fs_mode * setup.fs_mode;
  349.     files.top = 0;
  350.     files.twp = NULL;
  351.  
  352.     return topwp ;
  353. }
  354.  
  355. static  void    MENU_clip( REGS evt_t *ep, int x, int y, int sw )
  356. {
  357.     static  int     lastev = -1 ;
  358.     auto    int     now ;
  359.  
  360.     y = y ;         /*  意味なし  ワーニング回避  */
  361.  
  362.     now = ep->now ;
  363.  
  364.     switch( now )
  365.     {
  366.       case Ev_CLIP_MOS:    /*  押している間はへこむ  */
  367.         mos_ptn( MOSCSR_FINGER ) ;
  368.         stat_sw = sw ;
  369.         DSP_clip_on( ep ) ;
  370.         if( isrepeat( ep ) )
  371.         {
  372.             event = ep->no ;
  373.             ep->now = Ev_REP_MOS ;
  374.         }
  375.         break ;
  376.  
  377.       case Ev_DOLACK_MOS:  /*  押したまま、外れると戻る  */
  378.         ep->now = Ev_NON ;
  379.       case Ev_MOVE_MOS:
  380.         DSP_clip_off( ep ) ;
  381.       case Ev_OFF_MOS:
  382.         mos_ptn( MOSCSR_FINGER ) ;
  383.         break ;
  384.  
  385.       case Ev_REP_MOS:
  386.         if( lastev == Ev_REP_MOS )
  387.             event = ep->no ;
  388.         break ;
  389.  
  390.       case Ev_SELECT_MOS:  /*  その場で離すと、実行  */
  391.         if( !isrepeat( ep ) )
  392.             event = ep->no ;
  393.         click_pos = ( x - ep->x1 ) / 8 ;
  394.         DSP_clip_off( ep ) ;
  395.         ep->now = Ev_ON_MOS ;
  396.       case Ev_ON_MOS:      /*  ボタンの上にいるときは、カーソルを変更  */
  397.         mos_ptn( MOSCSR_FINGER ) ;
  398.         break ;
  399.     }
  400.  
  401.     lastev = now ;
  402. }
  403.  
  404. static  char   *dsp_name( REGS WCBUF *wp, int title )
  405. {                                   /*  ファイル名の表示の準備  */
  406.     static  char    dmy[80] ;
  407.     auto    int     mode ;
  408.  
  409.     mode = title == ON ? 1 : setup.fs_mode;
  410.  
  411.     switch( mode )
  412.     {
  413.       case 2:
  414.         *dmy = ISDIR(wp) ? '<':' ' ;
  415.         strcpy( dmy+1, formstrL( formname( wp->name ), 12 ) ) ;
  416.         dmy[13] = ISDIR(wp) ? '>':' ' ;
  417.         dmy[14] = '\0' ;
  418.         break ;
  419.  
  420.       default:
  421.         if( title )
  422.             strcpy( dmy, formstrL( wp->name, 13 ) ) ;
  423.         else
  424.             strcpy( dmy, formstrL( formname( wp->name ), 13 ) ) ;
  425.  
  426.         if( ISDIR( wp ) )
  427.             /* sprintf( dmy + 13, "   <DIR> " ) ; */
  428.             strcat( dmy, "   <DIR> " ) ;
  429.         else
  430.             /* sprintf( dmy + 13, "%8ld ", wp->size ) ; */
  431.             strcat( dmy, formdigitR( wp->size, 8, NO ) ),
  432.             strcat( dmy, " " ) ;
  433.  
  434. /*      sprintf( dmy + 22,"%02d-%02d-%02d %02d:%02d",
  435.             80+(wp->date >> 9), (wp->date >> 5) & 0x0F, wp->date & 0x1F,
  436.             wp->time >> 11, (wp->time >> 5) & 0x3F ) ; */
  437.         strcat( dmy,formdigitL( 80+(wp->date>>9),   2,YES )); strcat(dmy,"-") ;
  438.         strcat( dmy,formdigitL( (wp->date>>5)&0x0F, 2,YES )); strcat(dmy,"-");
  439.         strcat( dmy,formdigitL( wp->date & 0x1F,    2,YES )); strcat(dmy," ");
  440.         strcat( dmy,formdigitL( wp->time >> 11,     2,YES )); strcat(dmy,":");
  441.         strcat( dmy,formdigitL( (wp->time>>5)&0x3F, 2,YES ));
  442.         break ;
  443.     }
  444.     return dmy ;
  445. }
  446.  
  447. static  WCBUF   *jump( int num )    /*  num 番目の要素までジャンプする  */
  448. {
  449.     WCBUF   *wp = files.twp != NULL ? files.twp : files.topwp ;
  450.     int     top = files.top ;
  451.  
  452.     if( top == num || wp == NULL )  /*  現在と同じ  */
  453.         ;
  454.     else if( top < num )
  455.         for( ; wp->next != NULL && top < num ; top++ )
  456.             wp = wp->next ;
  457.     else if( top > num )
  458.         for( ; wp->back != NULL && top > num ; top-- )
  459.             wp = wp->back ;
  460.  
  461.     return wp ;
  462. }
  463.  
  464. /*  スクロール・バーのクリップ  */
  465.  
  466. static  void    MOVE_clip(REGS evt_t *ep, int x, int y, int sw)
  467. {
  468. WCBUF   *wp;
  469. int     pos;
  470.  
  471.     x = x, sw = sw ;    /*  意味なし。ワーニングを避けるため  */
  472.  
  473.     switch (ep->now)
  474.     {
  475.       case Ev_ON_MOS:
  476.         mos_ptn(MOSCSR_HAND);
  477.         break;
  478.  
  479.       case Ev_CLIP_MOS:
  480.         mos_ptn(MOSCSR_HAND);
  481.         MOS_horizon(ep->x1, ep->x2);
  482.         MOS_vertical(ep->y1, ep->y2);
  483.         ep->now = Ev_REP_MOS;
  484.       case Ev_REP_MOS:
  485.         event = MEv_NULL;
  486.         if (vol_size > 0)
  487.         {
  488.             pos = files.maxl * (y - ep->y1) / SCROLL_Y_SIZ;
  489.             if (pos + DSP_MAX > files.maxl)
  490.                 if ((pos = files.maxl - DSP_MAX) < 0)
  491.                     pos = 0;
  492.             pos -= pos % setup.fs_mode;
  493.  
  494.             if ((wp = jump(pos)) != files.twp)
  495.                 dsp_all(FALSE, wp, pos);
  496.         }
  497.         break;
  498.  
  499.       case Ev_OFF_MOS:
  500.         mos_ptn( MOSCSR_FINGER ) ;
  501.       case Ev_SELECT_MOS:
  502.         MOS_horizon( 2, 630 ) ;
  503.         MOS_vertical( 0, 470 ) ;
  504.         event = ep->no;
  505.         break;
  506.     }
  507. }
  508.  
  509. /*  スクロールバー  */
  510.  
  511. static  void    DSP_scr_bar(int rewrite)
  512. {
  513. const   short   x1 = SCROLL_X ;
  514. const   short   x2 = SCROLL_X + SCROLL_X_SIZ ;
  515. static  char    *bak = NULL ;
  516. static  short   last_max = -1 ;
  517. static  short   last_pos = -1 ;
  518. auto    short   bar_pos, diff ;
  519. static  struct  {
  520.         char    *ptn ;
  521.         u_short ds, x1,y1, x2,y2 ;
  522. }   param ;
  523.  
  524.     /*  ファイルが0のときは、スクロールバーを消去しておしまい  */
  525.     if (rewrite || files.max == 0)
  526.     {
  527.         dsp_box(x1,SCROLL_Y-4, x2,SCROLL_Y+SCROLL_Y_SIZ+4,
  528.                                             WIND_COL,WIND_COL,WIND_COL);
  529.         if (files.max == 0)
  530.             return ;
  531.     }
  532.  
  533.     /*  余白の合計の大きさ  */
  534.     if ((bar_size = SCROLL_Y_SIZ * DSP_MAX / files.maxl) > SCROLL_Y_SIZ)
  535.         bar_size = SCROLL_Y_SIZ-1;
  536.     vol_size = SCROLL_Y_SIZ - bar_size;
  537.     bar_pos = files.top * SCROLL_Y_SIZ / files.maxl;
  538.  
  539.     /*  初回は、ぜんぶ真面目に描く  */
  540.     if (bak == NULL || rewrite)
  541.     {
  542.         /*  枠  */
  543.         dsp_box( x1,SCROLL_Y-4, x2,SCROLL_Y+SCROLL_Y_SIZ+4,
  544.                                             BOX1_COL,BOX2_COL, WIND_COL ) ;
  545.         dsp_box( x1+8,SCROLL_Y-1, x2-8,SCROLL_Y+SCROLL_Y_SIZ/*+1*/,
  546.                                                     BLACK,BLACK, WHITE_l ) ;
  547.  
  548.         if (bak == NULL)
  549.         {
  550.             bak = malloc( (SCROLL_X_SIZ+7)/8*8*(SCROLL_Y_SIZ+1)/2 ) ;
  551.             if( bak != NULL )
  552.             {
  553.                 param.ptn = bak ;
  554.                 param.ds  = getds() ;
  555.                 param.x1 = x1 ;
  556.                 param.y1 = SCROLL_Y ;
  557.                 param.x2 = x2 ;
  558.                 param.y2 = SCROLL_Y+SCROLL_Y_SIZ+1 ;
  559.                 EGB_getBlock( gwork, (char *)¶m ) ;
  560.             }
  561.         }
  562.  
  563.         pbox(x1+2,SCROLL_Y+bar_pos, x2-2,SCROLL_Y+bar_pos+bar_size,
  564.                                                         WHITE_h,WHITE_h);
  565.     }
  566.     else        /*  2回目以降は、手抜きする  */
  567.     {
  568.         /*  表示上の差がなければ描画はしない  */
  569.         if (last_max != files.maxl)
  570.         {                       /*  スクロール・バーの大きさが変わった  */
  571.             param.y1 = SCROLL_Y;
  572.             param.y2 = SCROLL_Y + SCROLL_Y_SIZ;
  573.             EGB_putBlock( gwork, 0, (char *)¶m ) ;
  574.             pbox( x1+2,SCROLL_Y+bar_pos,
  575.                   x2-2,SCROLL_Y+bar_pos+bar_size, WHITE_h,WHITE_h ) ;
  576.         }
  577.         else if( ( diff = bar_pos - last_pos ) < 0 )
  578.         {                       /*  スクロール・バーの差分だけを描く  */
  579.             param.y1 = SCROLL_Y + bar_pos + bar_size + 1 ;
  580.             param.y2 = SCROLL_Y + last_pos + bar_size ;
  581.             EGB_putBlock( gwork, 0, (char *)¶m ) ;
  582.             if( last_pos - bar_pos > bar_size )
  583.                 last_pos = bar_pos + bar_size ;
  584.             pbox( x1+2,SCROLL_Y+bar_pos,
  585.                   x2-2,SCROLL_Y+last_pos, WHITE_h,WHITE_h ) ;
  586.         }
  587.         else if( diff > 0 )
  588.         {
  589.             param.y1 = SCROLL_Y + last_pos ;
  590.             param.y2 = SCROLL_Y + bar_pos ;
  591.             EGB_putBlock( gwork, 0, (char *)¶m ) ;
  592.             if( bar_pos - last_pos > bar_size )
  593.                 last_pos = bar_pos - bar_size ;
  594.             pbox( x1+2,SCROLL_Y+last_pos+bar_size,
  595.                   x2-2,SCROLL_Y+bar_pos+bar_size, WHITE_h,WHITE_h ) ;
  596.         }
  597.     }
  598.  
  599.     last_max = files.maxl;
  600.     last_pos = bar_pos ;
  601. }
  602.  
  603. static  void    dsp_mark(int pos)
  604. {
  605. int     xpos, ypos, xsiz;
  606.  
  607.     xpos = DSP_X + 2 + (setup.fs_mode == 2 ? (pos % 2) * 148 + 4 : 0);
  608.     xsiz = setup.fs_mode == 2 ? 134 : (DSP_LEN * 8 + 2);
  609.     ypos = DSP_Y + 1 + (setup.fs_mode == 2 ? (pos / 2) : pos) * SPC_Y;
  610.  
  611.     EGB_writeMode(gwork, 4 /* xor */);
  612.     pbox(xpos,ypos, xpos+xsiz,ypos+SIZ_Y-2, WIND_COL,WIND_COL);
  613.     EGB_writeMode(gwork, 0 /* pset */);
  614. }
  615. static  void    dsp_clear_slot(int pos)
  616. {
  617. int     xpos, ypos, xsiz;
  618.  
  619.     xpos = DSP_X + 2 + (setup.fs_mode == 2 ? (pos % 2) * 148 + 4 : 0);
  620.     xsiz = setup.fs_mode == 2 ? 134 : (DSP_LEN * 8 + 2);
  621.     ypos = DSP_Y + 1 + (setup.fs_mode == 2 ? (pos / 2) : pos) * SPC_Y;
  622.  
  623.     pbox(xpos,ypos, xpos+xsiz,ypos+SIZ_Y-2, WIND_COL,WIND_COL);
  624. }
  625. static  void    dsp_file(WCBUF *wp, mevt_t pos, int rewrite, int evt)
  626. {
  627. int     xpos, ypos, xsiz;
  628.  
  629.     xpos = DSP_X + 1 + (setup.fs_mode == 2 ? (pos%2)*148+4 : 0);
  630.     xsiz = setup.fs_mode == 2 ? 136 : (DSP_LEN*8+4);
  631.     ypos = DSP_Y + (setup.fs_mode == 2 ? (pos / 2) : pos) * SPC_Y;
  632.  
  633.     if (rewrite)
  634.         box2(xpos,ypos, xpos+xsiz,ypos+SIZ_Y, BOX1_COL,BOX2_COL);
  635.  
  636.     wrt(dsp_name(wp, OFF), xpos+(setup.fs_mode==2 ? 13:1),ypos+1,
  637.          (ISHID(wp) || ISSYS(wp))? BLACK_l:WHITE_h,WIND_COL, FNT_SIZ);
  638.  
  639.     if (wp->mark == ON)
  640.         dsp_mark(pos);
  641.  
  642.     if (evt)
  643.         EVT_set_node(xpos,ypos, xsiz,SIZ_Y, 1,MENU_clip,MEv_MAX + pos, NOP);
  644. }
  645.  
  646. /*  ファイル名の一覧表示  */
  647.  
  648. static  void    dsp_all(int rewrite, WCBUF *wp, int top)
  649. {
  650. int     i;
  651. char    tmp[128];
  652. char    *p;
  653.  
  654.     EVT_level_free(1);
  655.  
  656.     MOS_disp(mos_disp_off);
  657.  
  658.   /* カレント・ディレクトリ表示 */
  659.     strcpy(tmp, crrdir);
  660.     if ((p = jstrrchr(tmp, '\\')) != NULL && strlen(tmp) > 3)
  661.         *p = '\0';      /* 余計な \ をつぶす */
  662.     /* sprintf( tmp, "%-*s", CLIP_SIZ, tmp ) ; */
  663.     strcpy( tmp, formstrL( tmp, CLIP_SIZ ) ) ;
  664.     tmp[CLIP_SIZ] = '\0' ;
  665.     wrt( tmp, CLIP_X+FNT_SPC_X, CLIP_Y+FNT_SPC_Y,
  666.                                     WHITE_h, WIND_COL, FNT_SIZ ) ;
  667.  
  668.   /* マーク・ファイルがあったら消去 */
  669.     if (marked >= files.top && marked < files.top+DSP_MAX)
  670.         dsp_mark(marked - files.top);
  671.  
  672.     files.twp = wp ;
  673.     files.top = top ;
  674.  
  675.   /* 下地を描く */
  676.     if (rewrite)
  677.         pbox(DSP_X,DSP_Y, DSP_X+DSP_LEN*8+5,DSP_Y+DSP_MAX_SLOT*SPC_Y-1,
  678.                                                             WIND_COL,WIND_COL);
  679.   /* スクロール・バーを描く */
  680.     DSP_scr_bar(rewrite);
  681.  
  682.   /* ファイル名表示 */
  683.     for (i = 0; wp != NULL && i < DSP_MAX; i++)
  684.     {
  685.         dsp_file(wp,i, rewrite,ON);
  686.         wp = wp->next;
  687.     }
  688.     for (; i < DSP_MAX; i++)
  689.     {
  690.         dsp_clear_slot(i);
  691.     }
  692.  
  693.     MOS_disp(MOS_ON);
  694. }
  695.  
  696. static  void    dsp_card(int flush) /* WILD CARD 表示 */
  697. {
  698. auto    int     i;
  699. static  CDBUF   cardbuf[CARD_MAX];
  700.  
  701.     EVT_level_free(2);
  702.  
  703.     MOS_disp(mos_disp_off);
  704.  
  705.     if (flush)
  706.         dsp_box(CARD_X-2,CARD_Y-2,
  707.                 CARD_X+CARD_LEN*8+4+2,CARD_Y+(CARD_MAX-1)*SPC_Y+SIZ_Y+2,
  708.                 BOX1_COL,BOX2_COL,WIND_COL);
  709.  
  710.     for (i = 0; i < CARD_MAX; i++)
  711.     {
  712.         if (card[i].name != NULL)
  713.             EVT_set_node(CARD_X,CARD_Y+i*SPC_Y, CARD_LEN*8+4,SIZ_Y,
  714.                          2,MENU_clip,MEv_MAX+i+DSP_MAX_EVT, NOP);
  715.  
  716.         if (flush || cardbuf[i].name != card[i].name ||
  717.                      cardbuf[i].mark != card[i].mark)
  718.         {
  719.             cardbuf[i].name = card[i].name;
  720.             cardbuf[i].mark = card[i].mark;
  721.  
  722.             if (card[i].name != NULL)
  723.             {
  724.                 dsp_box(CARD_X,CARD_Y+i*SPC_Y,
  725.                         CARD_X+CARD_LEN*8+4,CARD_Y+i*SPC_Y+SIZ_Y,
  726.                         BOX1_COL,BOX2_COL,
  727.                         card[i].name != NULL && 
  728.                         card[i].mark != FALSE ? HIT_COL:WIND_COL);
  729.  
  730.                 wrt(formname(card[i].name),
  731.                     CARD_X+FNT_SPC_X, CARD_Y+FNT_SPC_Y+SPC_Y*i,
  732.                     WHITE_h, card[i].mark != FALSE ? HIT_COL:WIND_COL,
  733.                     FNT_SIZ);
  734.             }
  735.             else
  736.                 dsp_box(CARD_X,CARD_Y+i*SPC_Y,
  737.                         CARD_X+CARD_LEN*8+4,CARD_Y+i*SPC_Y+SIZ_Y,
  738.                         WIND_COL, WIND_COL, WIND_COL);
  739.         }
  740.     }
  741.  
  742.     MOS_disp(MOS_ON);
  743. }
  744.  
  745. /*
  746.  *  ワイルドカード表示部分の、指定番号スロットの周囲に枠を描く
  747. */
  748. static  void    dsp_card_slot(int slot)
  749. {
  750. /*    if (card[slot].name != NULL) */
  751.     {
  752.         MOS_disp(mos_disp_off);
  753.  
  754.         box(CARD_X-1,CARD_Y+slot*SPC_Y-1,
  755.             CARD_X+CARD_LEN*8+4+1,CARD_Y+slot*SPC_Y+SIZ_Y+1,
  756.             WHITE_h, 0xFFFFFFFF, MODE_XOR);
  757.  
  758.         MOS_disp(MOS_ON);
  759.     }
  760. }
  761.  
  762. /*  ドライブ名パネルの表示  */
  763.  
  764. static  void    dsp_drive(int re_write)
  765. {
  766.     static  int     last_cdrv = -1 ;
  767.     auto    int     DRV_X,DRV_Y, DRV_X_SIZ,DRV_X_SPC, DRV_NUM ;
  768.     auto    int     drv_x, drv_y ;
  769.     auto    int     i, n, dt ;
  770.  
  771.     static  int     drv_max = ERR ;
  772.  
  773.     int     check_can_use_drive(int num)    /*  num = 1:A 2:B ...  */
  774.     {
  775.         Registers.AX.R = 0x4408;
  776.         Registers.BX.R = num & 0xFF;
  777.         calldos();
  778.         if ((Registers.Flags & 1) == 0) /* エラーなし */
  779.             return Registers.AX.R;          /* 交換可能:0  交換不能:1 */
  780.         else                            /* エラーあり */
  781.             return -1;                      /* エラー: -1 */
  782.     }
  783.  
  784.     if (drv_max == ERR)
  785.     {
  786.         u_char  info[200];
  787.  
  788.         ESR_setupInfo((char *)info);    /*  システム情報取得  */
  789.  
  790.         for (drv_max = i = 0; i < HARD_DRV_MAX; i++)
  791.         {
  792.             switch (disktype[i] = info[0x30 + i * 2])
  793.             {
  794.               case IS_FLP:      /*  FLOPPY DISK  */
  795.               case IS_SCSI:     /*  SCSI HARD DISK  */
  796.               case IS_RAM:      /*  RAM DISK  */
  797.               case IS_ROM:      /*  ROM DISK  */
  798.                 break ;
  799.  
  800.               case IS_MDC:      /*  MDC HARD DISK  : 処理法が不明のため  */
  801.               default:          /*  IS_NON(未割り当て) か 不明  */
  802.                 disktype[i] = IS_NON ;      /*  処理法が不明のため  */
  803.                 continue ;
  804.             }
  805.             drv_max++;
  806.         }
  807.         disktype[HARD_DRV_MAX] = IS_CDR;    /*  CD-ROM DRIVE  */
  808.         drv_max++;
  809.  
  810.         for (i = 0; i < DRV_MAX; i++)
  811.             if (disktype[i] == IS_NON)      /*  空いているドライブすべて  */
  812.             {
  813.                 switch (check_can_use_drive(i+1))
  814.                 {
  815.                   case 1:   /*  交換不能(HD)  */
  816.                     disktype[i] = IS_SCSI ; break ;
  817.                   case 0:   /*  交換可能(FD,ICMC,etc)  */
  818.                     disktype[i] = IS_FLP ; break ;
  819.                   default:
  820.                     continue ;
  821.                 }
  822.                 drv_max++;
  823.             }
  824.  
  825.         getdir((char *)info);
  826.         CDRV = info[0] - 'A';
  827.     }
  828.  
  829.     EVT_level_free( 3 ) ;
  830.  
  831.     MOS_disp( mos_disp_off ) ;
  832.  
  833.     DRV_X_SIZ = FNT_SPC_X*2 + 56 ;
  834.     DRV_X_SPC = FNT_SPC_X ;
  835.     DRV_NUM = 13*(2-drv_max/15) ;
  836.  
  837.     if( drv_max > 14 )
  838.         DRV_X = 12, DRV_Y = 47 ;
  839.     else
  840.         DRV_X = 52, DRV_Y = 28, DRV_X_SIZ += 8, DRV_X_SPC += 4 ;
  841.  
  842.     if( re_write )
  843.     {
  844.         last_cdrv = -1 ;
  845.  
  846.         dsp_box( DRV_X - 2, DRV_Y - 2,
  847.                  DRV_X + (DRV_X_SIZ + 2) * (drv_max / 15 + 1),
  848.                  DRV_Y + (drv_max > 14 ? 12:(drv_max - 1)) * SPC_Y + SIZ_Y + 2,
  849.                  BOX1_COL, BOX2_COL, WIND_COL);
  850.     }
  851.  
  852.     for (i = n = 0; i < DRV_MAX; i++)
  853.     {
  854.         if ((dt = disktype[i]) != IS_NON)
  855.         {
  856.             drv_x = DRV_X + (n/DRV_NUM)*(DRV_X_SIZ+2) ;
  857.             drv_y = DRV_Y + (n%DRV_NUM)*SPC_Y ;
  858.  
  859.             if( re_write || i == last_cdrv || i == CDRV )
  860.             {
  861.                 dsp_box( drv_x,           drv_y,
  862.                          drv_x+DRV_X_SIZ, drv_y+SPC_Y-2,
  863.                          BOX1_COL, BOX2_COL,
  864.                          i == CDRV ? HIT_COL:WIND_COL ) ;
  865.                 if( dt == 0 && i < 3 )      /*  内蔵FDは特別扱い  */
  866.                     dt = 7 ;
  867.                 DSP_ptnColor( drv_x+DRV_X_SPC+2,drv_y+FNT_SPC_Y+1,
  868.                                                     14,12, drv_icn[i], 1 ) ;
  869.                 DSP_ptnColor( drv_x+DRV_X_SPC+21,drv_y+FNT_SPC_Y,
  870.                                                     31,14, dev_icn[dt], 1 ) ;
  871.             }
  872.  
  873.             EVT_set_node( drv_x,drv_y, DRV_X_SIZ,SPC_Y-2,
  874.                           3, MENU_clip, MEv_MAX+i+DSP_MAX_EVT+CARD_MAX, NOP ) ;
  875.             n ++ ;
  876.         }
  877.     }
  878.  
  879.     MOS_disp( MOS_ON ) ;
  880.  
  881.     last_cdrv = CDRV ;
  882. }
  883.  
  884. static  void    dsp_clip( void )
  885. {
  886.     EVT_level_free( 4 ) ;
  887.  
  888.     MOS_disp( mos_disp_off ) ;
  889.  
  890.     dsp_box( CLIP_X-6,CLIP_Y-2, CLIP_X+CLIP_SIZ*8+FNT_SPC_X*2+5,CLIP_Y+SIZ_Y+2,
  891.                                             BOX1_COL,BOX2_COL,WIND_COL ) ;
  892.  
  893.     dsp_box( DSP_X-2,ROLLUP_Y-2, ROLL_X+ROLL_LEN*8+4+1,ROLLDOWN_Y+SIZ_Y+2,
  894.                                             BOX1_COL,BOX2_COL,WIND_COL ) ;
  895.  
  896.     BTN_set(CLIP_X,CLIP_Y, CLIP_SIZ*8+FNT_SPC_X*2+1,SIZ_Y, WIND_COL,
  897.                                             4,MENU_clip,MEv_UPPERDIR, NOP);
  898.  
  899.     BTN_set( ROLL_X,ROLLUP_Y, ROLL_LEN*8+3,SIZ_Y, WIND_COL,
  900.                                             4,MENU_clip,MEv_vUP, REP ) ;
  901.     wrt( "▲", ROLL_X+FNT_SPC_X, ROLLUP_Y+FNT_SPC_Y,
  902.                                             WHITE_h,WIND_COL, FNT_SIZ ) ;
  903.  
  904.     BTN_set( ROLL_X,ROLLDOWN_Y, ROLL_LEN*8+3,SIZ_Y, WIND_COL,
  905.                                             4,MENU_clip,MEv_vDOWN, REP ) ;
  906.     wrt( "▼", ROLL_X+FNT_SPC_X,ROLLDOWN_Y+FNT_SPC_Y,
  907.                                             WHITE_h,WIND_COL, FNT_SIZ ) ;
  908.  
  909.     EVT_set_node(SCROLL_X,SCROLL_Y, SCROLL_X_SIZ,SCROLL_Y_SIZ,
  910.                                              6,MOVE_clip,MEv_DUMMY, NOP);
  911.  
  912.     dsp_box( EXIT_X-3,EXIT_Y-3, EXIT_X+31,EXIT_Y+30,
  913.                                             BOX1_COL,BOX2_COL,WIND_COL ) ;
  914.     BTN_set( EXIT_X,EXIT_Y, 28,27, WIND_COL, 4,MENU_clip,MEv_EXIT, NOP ) ;
  915.     DSP_ptnColor( EXIT_X,EXIT_Y, 31,31, ptn_door, 1 ) ;
  916.  
  917.     MOS_disp( MOS_ON ) ;
  918. }
  919.  
  920. static  void    dsp_sort( int re_write )
  921. {
  922.     EVT_level_free( 5 ) ;
  923.  
  924.     MOS_disp( mos_disp_off ) ;
  925.  
  926.     if( re_write )
  927.     {
  928.         dsp_box(SORT_X-2,SORT_Y-2,
  929.                 SORT_X+SORT_LEN*8+4+2, SORT_Y+(SIZ_Y+2)*2,
  930.                 BOX1_COL,BOX2_COL,WIND_COL ) ;
  931.  
  932.      /* wrt( " ソート条件 ", SORT_X+FNT_SPC_X, SORT_Y+FNT_SPC_Y-1, */
  933.         wrt( " \x83\x5Cート条件 ", SORT_X+FNT_SPC_X, SORT_Y+FNT_SPC_Y-1,
  934.                 WHITE_h,WIND_COL, FNT_SIZ ) ;
  935.     }
  936.  
  937.     BTN_set( SORT_X,SORT_Y+(SIZ_Y+3)-2, SORT_LEN*8+4,SIZ_Y+1,
  938.                                     HIT_COL, 5,MENU_clip,MEv_SORTMD, REP ) ;
  939.     wrt( sort_name[setup.sort_mode],
  940.                         SORT_X+FNT_SPC_X,SORT_Y+(SIZ_Y+3)+FNT_SPC_Y-2,
  941.                                     WHITE_h,HIT_COL, FNT_SIZ ) ;
  942.  
  943.     MOS_disp( MOS_ON ) ;
  944. }
  945.  
  946. static  void    dsp_column( int re_write )
  947. {
  948.     EVT_level_free( 7 ) ;
  949.  
  950.     MOS_disp( mos_disp_off ) ;
  951.  
  952.     if( re_write )
  953.     {
  954.         dsp_box(COLUMN_X-2,COLUMN_Y-2,
  955.                 COLUMN_X+COLUMN_LEN*8+4+2, COLUMN_Y+(SIZ_Y+2)*2,
  956.                 BOX1_COL,BOX2_COL,WIND_COL ) ;
  957.  
  958.      /* wrt( "  表示形式  ", COLUMN_X+FNT_SPC_X, COLUMN_Y+FNT_SPC_Y-1, */
  959.         wrt( "  \x95\x5C示形式  ", COLUMN_X+FNT_SPC_X,COLUMN_Y+FNT_SPC_Y-1,
  960.                                         WHITE_h,WIND_COL, FNT_SIZ ) ;
  961.     }
  962.  
  963.     BTN_set( COLUMN_X,COLUMN_Y+(SIZ_Y+3)-2, COLUMN_LEN*8+4,SIZ_Y+1,
  964.                                     HIT_COL, 7,MENU_clip,MEv_DISPMD, REP ) ;
  965.     wrt(fs_mode_name[setup.fs_mode-1],
  966.                                 COLUMN_X+FNT_SPC_X,COLUMN_Y+SIZ_Y+1+FNT_SPC_Y,
  967.                                     WHITE_h,HIT_COL,FNT_SIZ);
  968.  
  969.     MOS_disp( MOS_ON ) ;
  970. }
  971.  
  972. static  void    RIGHT_click( void )
  973. {
  974.     event = MEv_CANCEL;
  975. }
  976.  
  977.  
  978. /*  削除する。失敗したらERRを返す  */
  979.  
  980. static  int     wc_del( int no )
  981. {
  982.     int     i, j ;
  983.     int     find ;
  984.  
  985.     if( !card[no].allocate || card[no].name == NULL )
  986.         return ERR ;
  987.     free( card[no].name ) ;
  988.  
  989.     for( i = no ; i < CARD_MAX ; i ++ )
  990.     {
  991.         find = FALSE ;
  992.  
  993.         for( j = i + 1 ; j < CARD_MAX ; j ++ )
  994.             if( card[j].name != NULL )
  995.             {
  996.                 card[i].name = card[j].name ;
  997.                 card[i].mark = card[j].mark ;
  998.                 card[i].allocate = card[j].allocate ;
  999.  
  1000.                 card[j].name = NULL ;
  1001.                 card[j].mark = FALSE ;
  1002.                 card[j].allocate = TRUE ;
  1003.  
  1004.                 find = TRUE ;
  1005.                 break ;
  1006.             }
  1007.  
  1008.         if( !find )
  1009.         {
  1010.             card[i].name = NULL ;
  1011.             card[i].mark = FALSE ;
  1012.             card[i].allocate = TRUE ;
  1013.             break ;
  1014.         }
  1015.     }
  1016.  
  1017.     return( ERR+1 ) ;
  1018. }
  1019.  
  1020. void    wc_init( void )
  1021. {
  1022.     int     i ;
  1023.  
  1024.     for( i = 0; i < CARD_MAX; i++ )
  1025.         wc_del(i);
  1026. }
  1027.  
  1028.  
  1029.  
  1030. /*  ワイルドーカードを追加する。
  1031.  *  登録成功か、すでに登録されていた場合はスロット番号を返す。
  1032.  *  失敗なら ERR を返す
  1033. */
  1034. int     wc_apend( char *name, int mode )
  1035. {
  1036.     int     i ;
  1037.     char    *p ;
  1038.  
  1039.     if( ( p = jstrrchr( name, '\\' ) ) != NULL )
  1040.         name = p + 1 ;
  1041.  
  1042.     for( p = name = strdup( name ) ; *p != '\0' ; p ++ )
  1043.         *p = toup( *p ) ;
  1044.  
  1045.     for( i = 0 ; i < CARD_MAX ; i++ )
  1046.         if( card[i].name != NULL && strcmp( card[i].name, name ) == 0 )
  1047.         {
  1048.             if( mode == TRUE )
  1049.                 card[i].mark = card[i].mark != FALSE ? FALSE:TRUE ;
  1050.             return( i ) ;
  1051.         }
  1052.  
  1053.     for( i = 0 ; i < CARD_MAX ; i++ )
  1054.     {
  1055.         if( card[i].name == NULL )
  1056.         {
  1057.             card[i].name = name ;
  1058.             card[i].mark = mode ;
  1059.             return( i ) ;
  1060.         }
  1061.     }
  1062.  
  1063.     return( ERR ) ;
  1064. }
  1065. static  void    set_fs_mode( int mode )
  1066. {
  1067.     switch( mode )
  1068.     {
  1069.       case 1:   setup.fs_mode = 1 ; DSP_MAX = DSP_MAX1 ; break ;
  1070.       case 2:   setup.fs_mode = 2 ; DSP_MAX = DSP_MAX2 ; break ;
  1071.     }
  1072.     files.maxl = (files.max + setup.fs_mode - 1) / setup.fs_mode * setup.fs_mode;
  1073. }
  1074.  
  1075. static  void    screen_setup( int flag )
  1076. {
  1077.     if (flag == ON)
  1078.     {
  1079.         DSP_writePage( gwork, 1 ) ;
  1080. #if MOUSE_PAGE!=1
  1081.         MOS_writePage( 1 ) ;
  1082.         MOS_horizon( 2, 630 ) ;
  1083.         MOS_vertical( 0, 470 ) ;
  1084. #endif
  1085.         EVT_control_ground( OFF ) ;
  1086.         EVT_control_cancel( ON ) ;
  1087.         mos_disp_off = MOS_OFF ;    /*  マウスカーソルを消す  */
  1088.     }
  1089.     else
  1090.     {
  1091. #if MOUSE_PAGE==1
  1092.         mos_disp_off = MOS_ON ;     /*  マウスカーソルを消す必要がない  */
  1093. #endif
  1094.         EVT_control_cancel( OFF ) ;
  1095.         EVT_control_ground( ON ) ;
  1096.         mos_backup( ON ) ;
  1097.         DSP_writePage( gwork, 0 ) ;
  1098. #if MOUSE_PAGE!=1
  1099.         MOS_writePage( 1 ) ;
  1100.         MOS_horizon( 2, 630 ) ;
  1101.         MOS_vertical( 0, 470 ) ;
  1102. #endif
  1103.         mos_backup( OFF ) ;
  1104.         mos_ptn( MOSCSR_FINGER ) ;
  1105.     }
  1106. }
  1107.  
  1108. /*
  1109.  *  ファイル・セレクタのスクロール
  1110. */
  1111. static  WCBUF   *up_scroll(WCBUF *wp, int *top)     /* スクロール */
  1112. {
  1113. int     tmp;
  1114.  
  1115.     tmp = files.top + setup.fs_mode;
  1116.  
  1117.     if (tmp + DSP_MAX > files.maxl)
  1118.         return wp;
  1119.     *top = tmp;
  1120. #if 0
  1121.     if ((*top = files.top + setup.fs_mode) + DSP_MAX >= files.max)
  1122.         *top = files.max - DSP_MAX;
  1123. #endif
  1124.     if (*top > files.top)
  1125.     {
  1126.         wp = jump(*top);
  1127.         dsp_all(FALSE, wp, *top);
  1128.     }
  1129.     return wp;
  1130. }
  1131. static  WCBUF   *down_scroll(WCBUF *wp, int *top)    /* 逆スクロール */
  1132. {
  1133.     if (files.top > 0)
  1134.     {
  1135.         if ((*top = files.top - setup.fs_mode) < 0)
  1136.             *top = 0;
  1137.         wp = jump(*top);
  1138.         dsp_all(FALSE, wp, *top);
  1139.     }
  1140.     return wp;
  1141. }
  1142.  
  1143. /*
  1144.  *  ファイル・マークの設定と解除
  1145. */
  1146. static  void    clear_mark(int redisp)
  1147. {
  1148. WCBUF *twp;
  1149.  
  1150.     if (marked == -1)       /* マークされていない */
  1151.         return;
  1152.  
  1153.     /* マークを解除 */
  1154.     twp = jump(marked);
  1155.     twp->mark = OFF;
  1156.  
  1157.     if (redisp && marked >= files.top && marked < files.top + DSP_MAX)
  1158.         dsp_mark(marked - files.top);
  1159.  
  1160.     marked = -1;
  1161. }
  1162. static  void    set_mark(int num)
  1163. {
  1164. WCBUF *twp;
  1165.  
  1166.     if (marked != -1)       /* どれかがマークされている */
  1167.         clear_mark(ON);
  1168.  
  1169.     /* マークを設定 */
  1170.     twp = jump(marked = num);
  1171.     twp->mark = ON;
  1172.  
  1173.     if (marked >= files.top && marked < files.top+DSP_MAX)
  1174.         dsp_mark(marked - files.top);
  1175. }
  1176.  
  1177. /*
  1178.  *  ディレクトリ移動
  1179. */
  1180. static  int     move_dir(char *newdir, char *last_dir)
  1181. {
  1182. WCBUF   *wp = NULL;
  1183. int     top = 0;
  1184.  
  1185.   /* ディレクトリ情報をクリア */
  1186.     files.topwp = wc_reset(files.topwp);
  1187.  
  1188.   /* ディレクトリを移動 */
  1189.     chdir(newdir);
  1190.     if (getdir(crrdir) == 0)  /*  No Error  */
  1191.         wp = files.topwp = wc_open();
  1192.  
  1193.   /* 以前いたディレクトリをマーク */
  1194.     if (last_dir != NULL && strlen(last_dir) > 0)
  1195.     {
  1196.         for (top = 0; wp != NULL; wp = wp->next, top++)
  1197.         {
  1198.             if (strcmp(wp->name, last_dir) == 0)
  1199.             {
  1200.                 wp->mark = ON;
  1201.                 marked = top;
  1202.                 break;
  1203.             }
  1204.         }
  1205.         if ((top -= DSP_MAX / 2) < 0)
  1206.             top = 0;
  1207.     }
  1208.  
  1209.   /* 行き過ぎていたら戻す */
  1210.     if (top + DSP_MAX >= files.maxl) {
  1211.         if ((top = files.maxl - DSP_MAX) < 0)
  1212.             top = 0;
  1213.     }
  1214.  
  1215.   /* 再表示 */
  1216.     top -= top % setup.fs_mode;
  1217.     wp = jump(top);
  1218.     dsp_all(TRUE, wp, top);
  1219.  
  1220.     return top;
  1221. }
  1222.  
  1223. static  keytbl_t    wc_key[] = {
  1224.     {0xFF5D, MEv_SORTMD   }, /*  PF1  : ソート条件   */
  1225.     {0xFF5E, MEv_DISPMD   }, /*  PF2  : 表示形式     */
  1226.     {0xFF5B, MEv_EXIT     }, /*  PF12 : EXIT         */
  1227.     {0xFF11, MEv_EXIT     }, /*  'Q'  : EXIT         */
  1228.     {  0x4F, MEv_uUP      }, /*   ←  :     前選択   */
  1229.     {  0x51, MEv_uDOWN    }, /*   →  :     次選択   */
  1230.     { 0x14F, MEv_hUP      }, /*  S+← : 高速前選択   */
  1231.     { 0x151, MEv_hDOWN    }, /*  S+→ : 高速次選択   */
  1232.     {  0x4D, MEv_sUP      }, /*   ↑  :     上選択   */
  1233.     {  0x50, MEv_sDOWN    }, /*   ↓  :     下選択   */
  1234.     { 0x14D, MEv_mUP      }, /*  S+↑ : 高速上選択   */
  1235.     { 0x150, MEv_mDOWN    }, /*  S+↓ : 高速下選択   */
  1236.     { 0x24D, MEv_vUP      }, /*  C+↑ : 逆スクロール */
  1237.     { 0x250, MEv_vDOWN    }, /*  C+↓ :   スクロール */
  1238.     { 0x100, MEv_REPEAT   }, /* SHIFT : ダミー発生   */
  1239.     {0xFF01, MEv_CANCEL   }, /*  ESC  : CANCEL       */
  1240.     {0xFF0E, MEv_ROOTDIR  }, /*   \   : ルートへ移動 */
  1241.     {0xFF0F, MEv_UPDIR    }, /*  BS   : ひとつ上のディレクトリへ移動 */
  1242.     {0xFF1D, MEv_SELECT   }, /*  CR   : 決定         */
  1243.     {0xFF73, MEv_SELECT   }, /*  実行 : 決定         */
  1244.     {0xFF26, MEv_LOGDRV   }, /*  'L'  : ドライブ選択 */
  1245.     {0xFF12, MEv_WILDCARD }, /*  'W'  : ワイルドカード入力 */
  1246.     {    -1, MEv_NULL     }, /*  おしまい            */
  1247. };
  1248.  
  1249.  
  1250. /*
  1251.  *  ファイルを選択する
  1252. */
  1253.  
  1254. char    *file_select(int enable_cancel)
  1255. {
  1256. static  int     top = 0;
  1257.         WCBUF   *wp;
  1258.         char    *file = NULL;
  1259.         char    *p;
  1260.         int     now_mouse, now_mark, now_wild = -1;
  1261.         int     last_mouse = -1, last_mark = -1, d_click;
  1262.         int     start, i, lines, num;
  1263.         mevt_t  raw_event = MEv_NULL;
  1264.         HEADER  *hd = NULL;
  1265.         LINPTR  *lp = NULL;
  1266.         dpl_t   *dot = NULL;
  1267.  
  1268. #if MOUSE_PAGE==1
  1269.     mos_disp_off = MOS_ON;  /* マウスカーソルを消す必要がない */
  1270. #endif
  1271.  
  1272.     MOS_disp(MOS_OFF);
  1273.  
  1274.     EVT_reset();
  1275.  
  1276.     cls(1, 0);
  1277.     cls(0, 8);
  1278.  
  1279.     mos_backup(ON);
  1280.     MOS_writePage(MOUSE_PAGE);
  1281.     MOS_horizon(2, 630);
  1282.     MOS_vertical(0, 470);
  1283.     mos_backup(OFF);
  1284.     set_mos_ptn(MOSCSR_CLOCK);  /* waiting cursor */
  1285.  
  1286.     dsp_drive(TRUE);    /* ドライブ名選択リスト */
  1287.     dsp_card(TRUE);     /* ワイルドカード選択リスト */
  1288.     dsp_sort(TRUE);     /* ソートモード選択リスト */
  1289.     dsp_column(TRUE);   /* ファイル表示モード選択リスト */
  1290.     dsp_clip();         /* タイトルライン表示 */
  1291.  
  1292.     getdir(crrdir);     /* 現在のディレクトリ */
  1293.     set_fs_mode(setup.fs_mode);
  1294.  
  1295.     files.topwp = wc_open();
  1296.     if (top + DSP_MAX >= files.maxl)
  1297.         if ((top = files.maxl - DSP_MAX) < 0)
  1298.             top = 0;
  1299.     if (marked != -1)
  1300.         (jump(marked))->mark = ON;
  1301.     wp = jump(top);
  1302.     dsp_all(TRUE, wp, top);
  1303.  
  1304.     EVT_control_cancel(OFF);
  1305.     EVT_set_ground(10, RIGHT_click, RIGHT);
  1306.     EVT_control_ground(ON);
  1307.  
  1308.     MOS_disp(MOS_ON);
  1309.  
  1310.     for (;;)
  1311.     {
  1312.         if (get_mos_ptn() == MOSCSR_CLOCK)
  1313.             mos_ptn(MOSCSR_FINGER);
  1314.  
  1315.         event = MEv_NULL;
  1316.         do {
  1317.             event = key_event(kb_check(), wc_key);
  1318.  
  1319.             if ((raw_event == MEv_mUP || raw_event == MEv_mDOWN) &&
  1320.                                             event == MEv_NULL && !ISDIR(wp))
  1321.             {
  1322.                 event = MEv_SELECT;
  1323.             }
  1324.  
  1325.             EVT_loop(1, 10);
  1326.         } while (event == MEv_NULL || event == MEv_REPEAT);
  1327.  
  1328.         raw_event = event;
  1329.  
  1330.         if (event == MEv_WILDCARD) {    /* ワイルドカード選択開始 */
  1331.             if (now_wild == -1) {
  1332.                 now_wild = 0;               /* 0番目にマークセット */
  1333.                 dsp_card_slot(now_wild);
  1334.                 wait_repeat();              /* キーから手を離すまで待つ */
  1335.                 continue;
  1336.             }
  1337.         }
  1338.         if (now_wild != -1)             /* ワイルドカード選択 */
  1339.         {
  1340.             if (event == MEv_sUP) {
  1341.                 dsp_card_slot(now_wild);
  1342.                 if (--now_wild < 0)
  1343.                     now_wild = 0;
  1344.                 dsp_card_slot(now_wild);
  1345.                 wait_repeat();          /* キーから手を離すまで待つ */
  1346.                 continue;
  1347.             }
  1348.             if (event == MEv_sDOWN) {
  1349.                 dsp_card_slot(now_wild);
  1350.                 if (++now_wild >= CARD_MAX)
  1351.                     now_wild = CARD_MAX - 1;
  1352.                 dsp_card_slot(now_wild);
  1353.                 wait_repeat();          /* キーから手を離すまで待つ */
  1354.                 continue;
  1355.             }
  1356.             if (event == MEv_SELECT)
  1357.             {
  1358.                 card[now_wild].mark = !card[now_wild].mark;
  1359.                 wait_repeat();          /* キーから手を離すまで待つ */
  1360.                 num = now_wild;
  1361.                 goto RE_PRINT;
  1362.             }
  1363.             if (event == MEv_CANCEL)
  1364.             {
  1365.                 dsp_card_slot(now_wild);
  1366.                 now_wild = -1;
  1367.                 wait_repeat();          /* キーから手を離すまで待つ */
  1368.                 goto RE_PRINT;
  1369.             }
  1370.         }
  1371.  
  1372.         if (event == MEv_SELECT)    /* 決定 */
  1373.         {
  1374.             if (marked < top || marked > top + DSP_MAX) /* 画面の外 */
  1375.                 ;
  1376.             else                                        /* 画面の中 */
  1377.                 event = MEv_MAX + marked - top;
  1378.         }
  1379.  
  1380.         if (event == MEv_LOGDRV)    /* ドライブ選択 */
  1381.         {
  1382.             screen_setup(ON);
  1383.             num = select_drive();
  1384.             screen_setup(OFF);
  1385.  
  1386.             if (num >= 0 && disktype[num] != IS_NON)    /* 有効なドライブ */
  1387.                 event = MEv_MAX + DSP_MAX_EVT + CARD_MAX + num;
  1388.             else
  1389.                 continue;
  1390.         }
  1391.  
  1392.         if (event == MEv_sUP || event == MEv_mUP ||
  1393.             event == MEv_uUP || event == MEv_hUP)
  1394.         {                                                       /* ↑ */
  1395.             num = (event == MEv_uUP || event == MEv_hUP) ? 1 : setup.fs_mode;
  1396.             if (marked != -1)       /* マークファイルがある時 */
  1397.             {
  1398.                 if (marked <= (num - 1))         /* ディレクトリの先頭 */
  1399.                     continue;
  1400.                 else if (marked < top || marked > top + DSP_MAX) /* 画面の外 */
  1401.                     event = MEv_MAX + DSP_MAX - 1;
  1402.                 else if (marked <= top + (num - 1))
  1403.                 {                                           /* 画面の先頭 */
  1404.                     event = MEv_MAX + marked - top - num + setup.fs_mode;
  1405.                     clear_mark(ON);
  1406.                     wp = down_scroll(wp, &top);
  1407.                 } else                          /* 画面の中 */
  1408.                     event = MEv_MAX + marked - top - num;
  1409.             }
  1410.             else                           /* マークファイルがない時 */
  1411.                 event = MEv_MAX + DSP_MAX - 1;
  1412.  
  1413.             if (event < 0)
  1414.                 continue;
  1415.             if (event >= MEv_MAX + files.max - files.top)
  1416.                 event = MEv_MAX + files.max - files.top - 1;
  1417.  
  1418.             wait_repeat();          /* キーから手を離すまで待つ */
  1419.         }
  1420.         else if (event == MEv_sDOWN || event == MEv_mDOWN ||
  1421.                  event == MEv_uDOWN || event == MEv_hDOWN)   /* ↓ */
  1422.         {
  1423.             num = (event == MEv_uDOWN || event == MEv_hDOWN) ? 1:setup.fs_mode;
  1424.             if (marked != -1) {     /* マークファイルがある時 */
  1425.                 if (marked < files.top ||
  1426.                             marked > files.top + DSP_MAX)
  1427.                                                 /* 画面の外 */
  1428.                     event = MEv_MAX;
  1429.                 else if (marked > files.max - num - 1)
  1430.                     continue;                   /* ディレクトリの最後 */
  1431.                 else if (marked >= top + DSP_MAX - num)
  1432.                 {                                       /* 画面の最後 */
  1433.                     event = MEv_MAX + marked - top + num - setup.fs_mode;
  1434.                     clear_mark(ON);
  1435.                     wp = up_scroll(wp, &top);
  1436.                 } else                                  /* 画面の途中 */
  1437.                     event = MEv_MAX + marked - top + num;
  1438.             }
  1439.             else                    /* マークファイルがない時 */
  1440.                 event = MEv_MAX;
  1441.  
  1442.             if (event >= MEv_MAX + files.max - files.top)
  1443.                 continue;
  1444.  
  1445.             wait_repeat();          /* キーから手を離すまで待つ */
  1446.         }
  1447.  
  1448.         if (event == MEv_CANCEL)
  1449.         {
  1450.             if (enable_cancel)   /*  CANCEL  */
  1451.             {
  1452.                 file = "\0";
  1453.                 break;
  1454.             }
  1455.         }
  1456.         else if (event == MEv_DUMMY)    /* スクロールバーによる */
  1457.         {
  1458.             top = files.top;
  1459.         }
  1460.         else if (event == MEv_vDOWN)    /* スクロール */
  1461.         {
  1462.             wp = up_scroll(wp, &top);
  1463.         }
  1464.         else if (event == MEv_vUP)      /* 逆スクロール */
  1465.         {
  1466.             wp = down_scroll(wp, &top);
  1467.         }
  1468.         else if (event == MEv_UPPERDIR ||   /* 上方のディレクトリへ移動 */
  1469.                  event == MEv_ROOTDIR  ||   /* ルートディレクトリへ移動 */
  1470.                  event == MEv_UPDIR)        /* ひとつ上のディレクトリへ移動 */
  1471.         {
  1472.             if (event == MEv_ROOTDIR)     /* ルートディレクトリへ移動 */
  1473.                 click_pos = 0;
  1474.             if (event == MEv_UPDIR)       /* ひとつ上のディレクトリ */
  1475.             {
  1476.                 if (strlen(crrdir) > 3)
  1477.                     crrdir[strlen(crrdir)-1] = '\0';
  1478.                 else
  1479.                     continue;
  1480.  
  1481.                 if ((p = jstrrchr(crrdir, '\\')) != NULL)
  1482.                     click_pos = p - crrdir - 1;
  1483.             }
  1484.  
  1485.             if (click_pos < strlen(crrdir))
  1486.             {
  1487.             char    last_dir[256] = '\0';
  1488.  
  1489.                 clear_mark(OFF);        /*  マークファイルを解除  */
  1490.                 if (click_pos < 3)      /*  ルート  */
  1491.                 {
  1492.                     if (strlen(crrdir) > 3)
  1493.                         strncpy(last_dir, crrdir + 3, 255);
  1494.                     else
  1495.                         continue;
  1496.  
  1497.                     *(crrdir + 3) = '\0';
  1498.                 }
  1499.                 else
  1500.                 {
  1501.                     if ((p = jstrchr(crrdir + click_pos, '\\')) == NULL ||
  1502.                             *(p + 1) == '\0')
  1503.                         continue;       /*  カレント  */
  1504.                     else
  1505.                         *p = '\0', strncpy(last_dir, p+1, 255);
  1506.                 }
  1507.                 if ((p = jstrchr(last_dir, '\\')) != NULL)
  1508.                     *p = '\0';
  1509.                 mos_ptn(MOSCSR_CLOCK);
  1510.  
  1511.                 top = move_dir(crrdir, last_dir);
  1512.             }
  1513.         }
  1514.         else if (event == MEv_SORTMD)       /*  ソート条件  */
  1515.         {
  1516.         int     sort;
  1517.  
  1518.             screen_setup(ON);
  1519.             sort = select_drag(EVT_get_node(5, MEv_SORTMD), FALSE,
  1520.                                 SORT_X,SORT_Y+SIZ_Y*2+3, 99, sort_name, "123");
  1521.             screen_setup(OFF);
  1522.  
  1523.             if( sort >= 0 && sort != setup.sort_mode )
  1524.             {
  1525.                 setup.sort_mode = sort ;
  1526.                 dsp_sort( FALSE ) ;
  1527.                 wc_reset( files.topwp ) ;
  1528.                 files.topwp = wc_open() ;
  1529.                 clear_mark(OFF);        /*  マークファイルを解除  */
  1530.                 dsp_all( TRUE, files.topwp, 0 ) ;
  1531.             }
  1532.         }
  1533.         else if (event == MEv_EXIT)         /*  直接終了ボタン  */
  1534.         {
  1535.             screen_setup(ON);
  1536.             if (check_exit() == 1)
  1537.                 break;
  1538.             screen_setup(OFF);
  1539.         }
  1540.         else if (event == MEv_DISPMD)   /*  ファイル表示モードを変更  */
  1541.         {
  1542.         int     mode ;
  1543.  
  1544.             screen_setup(ON);
  1545.             mode = select_drag(EVT_get_node(7, MEv_DISPMD),FALSE,
  1546.                         COLUMN_X+1,COLUMN_Y+SIZ_Y*2+3, 97,fs_mode_name, "12");
  1547.             screen_setup(OFF);
  1548.  
  1549.             if (mode >= 0 && mode+1 != setup.fs_mode)
  1550.             {
  1551.                 set_fs_mode(mode + 1);
  1552.                 dsp_column(FALSE);          /*  ファイル表示モード  */
  1553.                 if ((top = files.top) + DSP_MAX >= files.maxl)
  1554.                     if ((top = files.maxl - DSP_MAX) < 0)
  1555.                         top = 0;
  1556.                 top -= top % setup.fs_mode;
  1557.                 wp = jump(top);
  1558.                 dsp_all(TRUE, wp, top);
  1559.             }
  1560.         }
  1561.         else if ((num = event - MEv_MAX) >= 0 && num < DSP_MAX)
  1562.         {                                           /* ファイルを選択 */
  1563.             top = files.top;
  1564.             wp = jump(files.top + num);
  1565.  
  1566.             if (rbtn(stat_sw) == TRUE)      /*  右クリックによる選択  */
  1567.             {
  1568.                 if (*(p = subname(wp->name)) != '\0')
  1569.                 {                                   /*  拡張子があれば  */
  1570.                 char    tmp[32] ;
  1571.  
  1572.                     /* sprintf( tmp, "*.%s", p ) ; */
  1573.                     strcpy( tmp, "*." ) ; strcpy( tmp+2, p ) ;
  1574.                     event = wc_apend(tmp, TRUE) + DSP_MAX_EVT;
  1575.                     goto RE_PRINT;
  1576.                 }
  1577.             }
  1578.  
  1579.             if (ISDIR(wp))          /* ディレクトリ選択 */
  1580.             {
  1581.               /* キーボードによる通過 */
  1582.                 if (raw_event != event && raw_event != MEv_SELECT)
  1583.                 {
  1584.                     set_mark(files.top + num);
  1585.                     continue;
  1586.                 }
  1587.  
  1588.               /*  指定のディレクトリへ移動  */
  1589.                 mos_ptn(MOSCSR_CLOCK);
  1590.  
  1591.                 clear_mark(OFF);        /*  マークファイルを解除  */
  1592.  
  1593.                 if (strcmp(wp->name, "..") == 0)    /*  ひとつ上へ移動  */
  1594.                 {
  1595.                     char    last_dir[256] ;
  1596.  
  1597.                     crrdir[strlen(crrdir)-1] = '\0' ;
  1598.                     strncpy( last_dir, jstrrchr( crrdir, '\\' ) + 1, 255 ) ;
  1599.  
  1600.                     top = move_dir(wp->name, last_dir);
  1601.                 }
  1602.                 else                    /*  指定の下位ディレクトリへ移動  */
  1603.                 {
  1604.                     top = move_dir(wp->name, NULL);
  1605.                 }
  1606.             }
  1607.             else                        /*  ファイル指定  */
  1608.             {
  1609.             char    tmpfile[256];
  1610.  
  1611.                 set_mark(files.top + num);    /* マーク設定  */
  1612.  
  1613.                 if (raw_event == MEv_mUP || raw_event == MEv_mDOWN ||
  1614.                     raw_event == MEv_hUP || raw_event == MEv_hDOWN)
  1615.                     continue;
  1616.  
  1617.                 /*  ダブル・クリックの確認  */
  1618.                 now_mouse = MOS_getTime();
  1619.                 now_mark = num + top;
  1620.                 if (now_mark == last_mark &&
  1621.                         now_mouse <= last_mouse + setup.db_click)
  1622.                     d_click = TRUE;
  1623.                 else
  1624.                     d_click = FALSE;
  1625.                 last_mouse = now_mouse;
  1626.                 last_mark = now_mark;
  1627.  
  1628.                 if (wp->size == 0)          /*  空のファイルはパス  */
  1629.                     continue;
  1630.  
  1631.                 if (d_click)        /* ダブル・クリックならば */
  1632.                 {
  1633.                     strcat( crrdir, wp->name ) ;    /*  フルパスにして渡す  */
  1634.                     file = crrdir ;
  1635.                     break ;
  1636.                 }
  1637.  
  1638.                 strcpy( tmpfile, crrdir ) ;     /*  フルパスにする  */
  1639.                 strcat( tmpfile, wp->name ) ;
  1640.  
  1641.                 backup_file( BACKUP ) ;
  1642.  
  1643.                 dot = get_now_dpl() ;
  1644.                 if( ( hd = read_sub( tmpfile, FILE_PREVIEW ) ) == NULL )
  1645.                     continue ;
  1646.  
  1647.                 start = dot->max_y-1
  1648.                 - ( ( dot->font*(dot->max_y-1) + dot->ofs ) - 316 )/dot->font ;
  1649.  
  1650.                 lines = start*dot->font + dot->ofs - 2 ;
  1651.                 pbox( 2,lines, 645,480, CHR_COL,BAK_COL ) ;
  1652.                 wrt( dsp_name( wp, ON ),
  1653.                                 X_DOTOFS,lines-18,CHR_COL,BAK_COL,FNT_SIZ ) ;
  1654.  
  1655.                 for( lines=1, i = start ;
  1656.                      i < dot->max_y && lines < hd->line_max ;
  1657.                      i++, lines++ )
  1658.                 {
  1659.                     lp = &(base[lines/LINEPTRs]->ptr[lines%LINEPTRs]) ;
  1660.                     dsp_line( i, lp->buf, lp->bytes ) ;
  1661.                 }
  1662.                 free_head() ;
  1663.  
  1664.                 backup_file( RESTORE ) ;
  1665.             }
  1666.             last_mouse = MOS_getTime() ;
  1667.         }
  1668.         else if ((num -= DSP_MAX_EVT) < CARD_MAX)   /* ワイルド・カード */
  1669.         {
  1670.             if (rbtn(stat_sw) == TRUE)      /* 右クリックによる選択 */
  1671.             {
  1672.                 if (wc_del(num) != ERR)
  1673.                     goto RE_PRINT ;
  1674.                 continue ;
  1675.             }
  1676.  
  1677.             if (card[num].name != NULL)
  1678.             {
  1679.                 card[num].mark = card[num].mark != FALSE ? FALSE:TRUE ;
  1680.  
  1681. RE_PRINT:
  1682.                 dsp_card(FALSE);
  1683.  
  1684.                 /*  "*.*" が押されてない時だけ  */
  1685.                 if (num == 0 || card[0].mark == FALSE)
  1686.                 {
  1687.                     wc_reset(files.topwp);
  1688.                     files.topwp = wc_open();
  1689.                     clear_mark(OFF);        /* マークファイルを解除 */
  1690.                     dsp_all(TRUE, files.topwp, 0);
  1691.                 }
  1692.             }
  1693.         }
  1694.         else if ((num -= CARD_MAX) < DRV_MAX)   /*  ドライブ・セレクト  */
  1695.         {
  1696.             mos_ptn(MOSCSR_CLOCK);
  1697.             chdrv(CDRV = num);
  1698.  
  1699. #ifdef CD_NO_STOP
  1700.             if (disktype[num] == IS_CDR)    /* CDだったら、連続にセット */
  1701.                 for (i = 0; i < 1000 && cdr_stptime(0, 0) == 0x80; i++) ;
  1702.                     /*  メディア交換直後ならば、リトライする  */
  1703.                     /*  無限ループに陥らないように・・・      */
  1704. #endif
  1705.             dsp_drive(FALSE);
  1706.             files.topwp = wc_reset(files.topwp);
  1707.             if (getdir(crrdir) == 0)    /* No Error */
  1708.                 files.topwp = wc_open();
  1709.             clear_mark(OFF);        /* マークファイルを解除 */
  1710.             dsp_all(TRUE, files.topwp, 0);
  1711.         }
  1712.     }
  1713.  
  1714.     EVT_reset() ;
  1715.     MOS_disp( MOS_OFF ) ;
  1716.     wc_reset( files.topwp ) ;
  1717.  
  1718.     cls( 0, 0 ) ;
  1719.     cls( 1, 0 ) ;
  1720.     MOS_writePage( 0 ) ;
  1721.  
  1722.     mos_disp_off = MOS_OFF ;    /*  マウスカーソルは消さなければならない  */
  1723.  
  1724.     return file ;
  1725. }
  1726.  
  1727.  
  1728.